﻿
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DAL;
using BOL;
using System.Data;
using System.Transactions;
using System.ComponentModel;
using UtilityExtensions;

namespace BOL
{
    [Serializable]
    public class RolBL
    {

        #region "CRUD"

        
        public int add( string descripcion,
                        bool inActivo,
                        int nivelPrespuesto,
                        int nivelComparativo,
                        decimal montoComparativo,
                        bool aprobarOC,
                        bool aprobarRC,
                        bool revisorRC,
                        bool depositocRC,
                        bool aperturarKardex,
                        
                       DataSet rolCol)
        {

            using (TransactionScope ts = new TransactionScope())
            {

                dbGestionDataContext _db =
                    new dbGestionDataContext(Parametros.strConnString);
                
                int idEmpleado= int.Parse(System.Web.HttpContext.Current.Session["idEmpleado"].ToString());
                
                Rol rol = new Rol();

                rol.add(_db,
                        descripcion,
                        inActivo,
                        nivelPrespuesto,
                        nivelComparativo,
                        montoComparativo,
                        aprobarOC,
                        aprobarRC,
                        revisorRC,
                        aperturarKardex,
                        depositocRC,
                        idEmpleado
                        );
                        

                //-------------------

                DataSet dsDiferencias = new DataSet();

                if (rolCol.HasChanges())
                {
                    dsDiferencias.Merge(rolCol.GetChanges());


                    foreach (DataRow drw in dsDiferencias.Tables["rolFormularioListInfo"].Rows)
                    {


                        if (drw.RowState == DataRowState.Added)
                        {

                            RolFormulario rolFormulario = new RolFormulario();
                            rolFormulario.add(_db,
                                rol.idInternal,
                                drw.Field<int>("idFormulario"),
                                drw.Field<int>("idAcceso")
                                );

   


                        }

                    }

                    foreach (DataRow drw in dsDiferencias.Tables["rolFormularioListInfo2"].Rows)
                    {


                        if (drw.RowState == DataRowState.Added)
                        {

                            RolFormulario rolFormulario = new RolFormulario();
                            rolFormulario.add(_db,
                                rol.idInternal,
                                drw.Field<int>("idFormulario"),
                                drw.Field<int>("idAcceso")
                                );




                        }

                    }

                }

                //-------------------


                ts.Complete();
                return rol.idInternal;
            }
        }

        public bool update(int idRolFormulario,
            string descripcion,
                        bool inActivo,
                        int nivelPrespuesto,
                        int nivelComparativo,
                        decimal montoComparativo,
                        bool aprobarOC,
                        bool aprobarRC,
                        bool revisorRC,
                        bool depositocRC,
                        bool aperturarKardex,
                         
                        DataSet rolCol)
        {
            using (TransactionScope ts = new TransactionScope())
            {

                using (dbGestionDataContext _db = new dbGestionDataContext(Parametros.strConnString))
                {
                    int idEmpleado = int.Parse(System.Web.HttpContext.Current.Session["idEmpleado"].ToString());

                    Rol rol = _db.Rols.Single(p => p.idInternal == idRolFormulario);
                    
                    rol.update(_db,
                        descripcion,
                        inActivo,
                        nivelPrespuesto,
                        nivelComparativo,
                        montoComparativo,
                        idEmpleado,
                        aprobarOC,
                        aprobarRC,
                        revisorRC,
                        depositocRC,
                        aperturarKardex);


                    //-------------------

                    DataSet dsDiferencias = new DataSet();

                    if (rolCol.HasChanges())
                    {
                        dsDiferencias.Merge(rolCol.GetChanges());


                        foreach (DataRow drw in dsDiferencias.Tables["rolFormularioListInfo"].Rows)
                        {

                            if (drw.RowState == DataRowState.Modified)
                            {

                                RolFormulario rolFormulario = _db.RolFormularios.Single(p => p.idInternal == drw.Field<int>("idInternal"));
                                rolFormulario.update(_db, drw.Field<int>("idAcceso"));

                            }

                            if (drw.RowState == DataRowState.Deleted)
                            {
                                drw.RejectChanges();

                                RolFormulario rolFormulario = _db.RolFormularios.Single(p => p.idInternal == drw.Field<int>("idInternal"));
                                rolFormulario.delete(_db);

                            }

                            if (drw.RowState == DataRowState.Added)
                            {

                                RolFormulario rolFormulario = new RolFormulario();
                                rolFormulario.add(_db,
                                    rol.idInternal,
                                    drw.Field<int>("idFormulario"),
                                    drw.Field<int>("idAcceso")
                                    );




                            }

                        }




                        foreach (DataRow drw in dsDiferencias.Tables["rolFormularioListInfo2"].Rows)
                        {

                            if (drw.RowState == DataRowState.Modified)
                            {

                                RolFormulario rolFormulario = _db.RolFormularios.Single(p => p.idInternal == drw.Field<int>("idInternal"));
                                rolFormulario.update(_db, drw.Field<int>("idAcceso"));

                            }

                            if (drw.RowState == DataRowState.Deleted)
                            {
                                drw.RejectChanges();

                                RolFormulario rolFormulario = _db.RolFormularios.Single(p => p.idInternal == drw.Field<int>("idInternal"));
                                rolFormulario.delete(_db);

                            }

                            if (drw.RowState == DataRowState.Added)
                            {

                                RolFormulario rolFormulario = new RolFormulario();
                                rolFormulario.add(_db,
                                    rol.idInternal,
                                    drw.Field<int>("idFormulario"),
                                    drw.Field<int>("idAcceso")
                                    );




                            }

                        }
                    }

                    //-------------------

                }


                    ts.Complete();
                    bool result = true;
                    return result;
                }
            }
        
        
 
        public bool delete(int idRol)
        {

            bool result = false;
            using (TransactionScope ts = new TransactionScope())
            {

                dbGestionDataContext _db;
                _db = new dbGestionDataContext(Parametros.strConnString);

                
                var q = _db.RolFormularios.Where(p=>p.idRol==idRol);
                _db.RolFormularios.DeleteAllOnSubmit(q);
                _db.SubmitChanges();

                Rol rol= _db.Rols.Single(p => p.idInternal == idRol);
                _db.Rols.DeleteOnSubmit(rol);

                _db.SubmitChanges();
                ts.Complete();
                result = true;
            }
            return result;

        }
        #endregion

        // validadcion de formulario

            //private void RestriccionForm(string URL,int idRol)
            //{
            //    int idEmpleado= int.Parse(System.Web.HttpContext.Current.Session["idEmpleado"].ToString());
                
            //    Rol rol= DbUtil.Db.RolFormularios.Single(p=>p.idInternal==
            //    var q= from  a on DbUtil.Db.RolFormularios(
            //    this.loadRol(

            //}





        [DataObjectMethod(DataObjectMethodType.Select, false)]
        public rolInfo loadRol(int idRol)
        {

                return (from a in DbUtil.Db.Rols
                        where a.idInternal== idRol
                        select new rolInfo
                        {
                            idInternal=a.idInternal,
                            descripcion=a.descripcion,
                            activo=a.activo.Value,
                            bitAprobarOrdenCompra=a.bitAprobarOrdenCompra,
                            nivelComparativo=a.nivelComparativo,
                            nivelPresupuesto=a.nivelPrespuesto,
                            montoComparativo=a.montoComparativo.Value,
                            fechaCre=a.fechaCre.Value,
                            fechaMod=a.fechaMod,
                            usuarioMod=a.usuarioMod,
                            usuarioCre=a.usuarioCre.Value,
                            bitAprobarRecepcion=a.bitAprobarRecepcion,
                            bitAperturaKardex=a.bitAperturaKardex,
                            bitRevisorRecepcion=a.bitRevisorRecepcion,
                          //  bitCerrarRecepcion=a.bitCerrarRecepcion,
                            
                         }).First();


            }

      


         [DataObjectMethod(DataObjectMethodType.Select, false)]
        public List<rolFormularioListInfo> getRolFormTransaccion(int idrol)
        {
                List<rolFormularioListInfo> lista = new List<rolFormularioListInfo>();
                //trerme los formularios que son controldos por acceso
                //Left join
                  
                lista = (from a in   DbUtil.Db.RolFormularios
                         where a.idRol == idrol & a.Formulario.tipoFormulario == 1
                         select  new rolFormularioListInfo{
                             Acceso=a.FormularioAcceso.descripcion,
                             formulario=a.Formulario.descripcion,
                             idAcceso=a.idAcceso.Value,
                             idFormulario=a.idFormulario.Value,
                             idInternal=a.idInternal,
                             idRol=a.idRol.Value,
                             intTipoFormulario = a.Formulario.tipoFormulario
                         }).ToList();
               
                return lista;

           
        }

         [DataObjectMethod(DataObjectMethodType.Select, false)]
         public List<rolFormularioListInfo> getRolFormLista(int idrol)
         {
             List<rolFormularioListInfo> lista = new List<rolFormularioListInfo>();
             //trerme los formularios que son controldos por acceso
             //Left join

             lista = (from a in DbUtil.Db.RolFormularios
                      where a.idRol == idrol & a.Formulario.tipoFormulario==2
                      select new rolFormularioListInfo
                      {
                          Acceso = a.FormularioAcceso.descripcion,
                          formulario = a.Formulario.descripcion,
                          idAcceso = a.idAcceso.Value,
                          idFormulario = a.idFormulario.Value,
                          idInternal = a.idInternal,
                          idRol = a.idRol.Value,
                          intTipoFormulario = a.Formulario.tipoFormulario
                      }).ToList();

             return lista;


         }

         [DataObjectMethod(DataObjectMethodType.Select, false)]
         public List<rolFormularioListInfo> getInsertRolFormTransaccion()
         {
             List<rolFormularioListInfo> lista = new List<rolFormularioListInfo>();
             //trerme los formularios que son controldos por acceso
             //Left join
             //por defaul solo lectura;
             FormularioAcceso fa = DbUtil.Db.FormularioAccesos.Single(p=>p.idinternal==1);

             lista = (from a in DbUtil.Db.Formularios
                      where a.tipoFormulario==1
                      select new rolFormularioListInfo
                      {
                          Acceso = fa.descripcion,
                          idAcceso = fa.idinternal,
                          formulario = a.descripcion,
                          idFormulario = a.idInternal,
                          
                          idRol = 0,
                          intTipoFormulario = 1,
                      }).ToList();

             foreach (var item in lista)
             {
                 item.idInternal = UtilityExtensions.Util.GenerarID();
             }

             return lista;


         }
         [DataObjectMethod(DataObjectMethodType.Select, false)]
         public List<rolFormularioListInfo> getInsertRolFormLista()
         {
             List<rolFormularioListInfo> lista = new List<rolFormularioListInfo>();
             //trerme los formularios que son controldos por acceso
             //Left join
             //por defaul solo lectura;
             FormularioAcceso fa = DbUtil.Db.FormularioAccesos.Single(p => p.idinternal == 1);

             lista = (from a in DbUtil.Db.Formularios
                      where a.tipoFormulario==2
                      select new rolFormularioListInfo
                      {
                          Acceso = fa.descripcion,
                          idAcceso = fa.idinternal,
                          formulario = a.descripcion,
                          idFormulario = a.idInternal,

                          idRol = 0,
                          intTipoFormulario = 1,
                      }).ToList();

             foreach (var item in lista)
             {
                 item.idInternal = UtilityExtensions.Util.GenerarID();
             }

             return lista;


         }


         [DataObjectMethod(DataObjectMethodType.Select, true)]
         public IEnumerable<RolListInfo> getRolList(int startRowIndex, int maximumRows, string sortExpression)
         {
             
             var q2 = from b in DbUtil.Db.Rols
                      select new RolListInfo
                    {
                                  idInternal= b.idInternal,
                                  descripcion = b.descripcion,
                                  activo=b.activo.Value,
                                  bitAprobarOrdenCompra=b.bitAprobarOrdenCompra,
                                  montoComparativo=b.montoComparativo.Value,
                                  nivelComparativo=b.nivelComparativo,
                                  nivelPresupuesto=b.nivelPrespuesto,
                                  
                                  
                          
                              };
             _count = q2.Count();
             q2 = ApplySort(q2, sortExpression);
             return q2.Skip(startRowIndex).Take(maximumRows);
         }
         int _count;
         public int Count(int startRowIndex, int maximumRows, string sortExpression)
         {
             return _count;
         }
         private IQueryable<RolListInfo> ApplySort(IQueryable<RolListInfo> q, string sortExpression)
         {
             switch (sortExpression)
             {
                 case "descripcion":
                     q = q.OrderBy(b => b.descripcion);
                     break;
                 case "descripcion DESC":
                     q = q.OrderByDescending(b => b.descripcion);
                     break;
                 case "activo":
                     q = q.OrderBy(b => b.activo);
                     break;
                 case "activo DESC":
                     q = q.OrderByDescending(b => b.activo);
                     break;

                 case "bitAprobarOrdenCompra":
                     q = q.OrderBy(b => b.bitAprobarOrdenCompra);
                     break;
                 case "bitAprobarOrdenCompra DESC":
                     q = q.OrderByDescending(b => b.bitAprobarOrdenCompra);
                     break;
                 case "montoComparativo":
                     q = q.OrderBy(b => b.montoComparativo);
                     break;
                 case "montoComparativo DESC":
                     q = q.OrderByDescending(b => b.montoComparativo);
                     break;
                 case "nivelPresupuesto":
                     q = q.OrderBy(b => b.nivelPresupuesto);
                     break;
                 case "nivelPresupuesto DESC":
                     q = q.OrderByDescending(b => b.nivelPresupuesto);
                     break;

                 default:
                     q = q.OrderByDescending(b=>b.idInternal);
                     break;
             }
             return q;
         }



         public class rolListInfo
         {
             public int  idInternal { get; set; }
             public string descripcion { get; set; }
             public bool  activo { get; set; }
         }


    }

   
}
